home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / WalImageFile.py < prev    next >
Text File  |  2006-12-03  |  5KB  |  126 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: WalImageFile.py 2134 2004-10-06 08:55:20Z fredrik $
  4. #
  5. # WAL file handling
  6. #
  7. # History:
  8. # 2003-04-23 fl   created
  9. #
  10. # Copyright (c) 2003 by Fredrik Lundh.
  11. #
  12. # See the README file for information on usage and redistribution.
  13. #
  14.  
  15. # NOTE: This format cannot be automatically recognized, so the reader
  16. # is not registered for use with Image.open().  To open a WEL file, use
  17. # the WalImageFile.open() function instead.
  18.  
  19. # This reader is based on the specification available from:
  20. #    http://www.flipcode.com/tutorials/tut_q2levels.shtml
  21. # and has been tested with a few sample files found using google.
  22.  
  23. import Image
  24.  
  25. def i32(c, o=0):
  26.     return ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24)
  27.  
  28. ##
  29. # Load texture from a Quake2 WAL texture file.
  30. # <p>
  31. # By default, a Quake2 standard palette is attached to the texture.
  32. # To override the palette, use the <b>putpalette</b> method.
  33. #
  34. # @param filename WAL file name, or an opened file handle.
  35. # @return An image instance.
  36.  
  37. def open(filename):
  38.     # FIXME: modify to return a WalImageFile instance instead of
  39.     # plain Image object ?
  40.  
  41.     if hasattr(filename, "read"):
  42.         fp = filename
  43.     else:
  44.         import __builtin__
  45.         fp = __builtin__.open(filename, "rb")
  46.  
  47.     # read header fields
  48.     header = fp.read(32+24+32+12)
  49.     size = i32(header, 32), i32(header, 36)
  50.     offset = i32(header, 40)
  51.  
  52.     # load pixel data
  53.     fp.seek(offset)
  54.  
  55.     im = Image.fromstring("P", size, fp.read(size[0] * size[1]))
  56.     im.putpalette(quake2palette)
  57.  
  58.     im.format = "WAL"
  59.     im.format_description = "Quake2 Texture"
  60.  
  61.     # strings are null-terminated
  62.     im.info["name"] = header[:32].split("\0", 1)[0]
  63.     next_name = header[56:56+32].split("\0", 1)[0]
  64.     if next_name:
  65.         im.info["next_name"] = next_name
  66.  
  67.     return im
  68.  
  69.  
  70. quake2palette = (
  71.     # default palette taken from piffo 0.93 by Hans HΣggstr÷m
  72.     "\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e"
  73.     "\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f"
  74.     "\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c"
  75.     "\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b"
  76.     "\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10"
  77.     "\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07"
  78.     "\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f"
  79.     "\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16"
  80.     "\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d"
  81.     "\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31"
  82.     "\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28"
  83.     "\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07"
  84.     "\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27"
  85.     "\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b"
  86.     "\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01"
  87.     "\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21"
  88.     "\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14"
  89.     "\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07"
  90.     "\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14"
  91.     "\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f"
  92.     "\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34"
  93.     "\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d"
  94.     "\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14"
  95.     "\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01"
  96.     "\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24"
  97.     "\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10"
  98.     "\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01"
  99.     "\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27"
  100.     "\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c"
  101.     "\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a"
  102.     "\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26"
  103.     "\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d"
  104.     "\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01"
  105.     "\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20"
  106.     "\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17"
  107.     "\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07"
  108.     "\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25"
  109.     "\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c"
  110.     "\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01"
  111.     "\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23"
  112.     "\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f"
  113.     "\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b"
  114.     "\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37"
  115.     "\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b"
  116.     "\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01"
  117.     "\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10"
  118.     "\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b"
  119.     "\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20"
  120. )
  121.  
  122. if __name__ == "__main__":
  123.     im = open("../hacks/sample.wal")
  124.     print im.info, im.mode, im.size
  125.     im.save("../out.png")
  126.